//tassa versiossa Calendar on muutettu luokaksi Kalenteri

package studentcalendar;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Scanner;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
    private static Scanner lukija = new Scanner(System.in);
    private static Kalenteri calendar1;

    public static void main(String[] args) throws Exception{

       // Main kali = new Main();
        //SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");

        try {
            calendar1 = new Kalenteri("events.json");
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        jsonPaivitys();
        paavalikko();
        
        //testataan tehda muutos ja committaa, koska commit ei toimi..
       

    }

    public static void jsonPaivitys(){
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        System.out.print("(json paivitetty viimeksi ");
        System.out.print(dateFormat.format(date));
        System.out.println(")");
    }
    public static void paavalikko() throws Exception{
        System.out.println("\n\n");
        System.out.println("***OPISKELIJAN KALENTERI***");
        System.out.println("|--------------------------|");
        System.out.println("|  1-PAIVA KERRALLAAN      |");
        System.out.println("|  2-VIIKKO KERRALLAAN     |");
        System.out.println("|  3-KUUKAUSI KERRALLAAN   |");
        System.out.println("| (4-poistu ohjelmasta)    |");
        System.out.println("|--------------------------|");
        int valinta=0;
        while(valinta<1 | valinta>4){
        System.out.print("Anna valintasi ja paina ENTER:");
        valinta = lukija.nextInt();
        lukija.nextLine();
        }
        switch (valinta) {
            case 1:  paivaKerrallaan();             break;
            case 2:  viikkoKerrallaan();            break;
            case 3:  kuukausiKerrallaan();          break;
            case 4:  Runtime.getRuntime().exit(0);  break;
        }
    }


    public static void paivaKerrallaan() throws Exception{
        System.out.println("\n\n\n\n");
        System.out.println("***PAIVA KERRALLAAN***\n");

        SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");

        Date pvmnyt = new Date();
        String str = df.format(pvmnyt);
        System.out.println("Nyt on "+str);

        System.out.println("Anna pvm muodossa dd.MM.yyyy");
        String pvm = "";
        pvm = lukija.nextLine();

        //System.out.println(pvm.length());
        
        Date paivamaara;
        if (pvm.length()==0){
            paivamaara = df.parse(str);
        }
        else{
            paivamaara = df.parse(pvm);
        }

        //muodostetaan paivan alku ja loppu
        SimpleDateFormat tarkka = new SimpleDateFormat("dd.MM.yyyy.HH.mm.ss");
        String apu = df.format(paivamaara);
        String alkumin = apu+".00.00.00";
        String loppumin = apu+".23.59.59";

//        System.out.println(alkumin);
//        System.out.println(loppumin);

        Date alku = tarkka.parse(alkumin);
        Date loppu = tarkka.parse(loppumin);

        SimpleDateFormat startdf = new SimpleDateFormat("dd.MM.yyyy   HH:mm");
        SimpleDateFormat enddf = new SimpleDateFormat("HH:mm");

      tulostaNaytolle(alku, loppu);

        
//       Event[] eventTaulukko = calendar1.findEventsByDate(alku, loppu);
//        int n=eventTaulukko.length;
//        for(int i = 0; i < n; i++){
//            for(int j=1; j < (n-i); j++){
//                Date e1 = eventTaulukko[i].getStartDate();
//                Date e2 = eventTaulukko[j].getStartDate();
//                if(e2.compareTo(e1) < 0){ // niin e2 pienempi
//                    //swap
//                    Event apumuuttuja = eventTaulukko[i];
//                    eventTaulukko[i] = eventTaulukko[j];
//                    eventTaulukko[j] = apumuuttuja;
//                }
//            }
//        }
////for(Event e : eventTaulukko
//        for(int a = 0; a < eventTaulukko.length; a++) {
//                System.out.println(
//                startdf.format(eventTaulukko[a].getStartDate())+"-"+
//                enddf.format(eventTaulukko[a].getEndDate())+"   "+
//                eventTaulukko[a].getName()+"   "+eventTaulukko[a].getLocation());
//        }
//
        
        //päivän oma valikko, päiväkirjalle oma valikko

        System.out.println();
        System.out.println("_______________________________________________________________");
        System.out.println("1-LISÄÄ TAPAHTUMA   2-TULOSTA TIEDOSTOON   3-PALAA PÄÄVALIKKOON");
        int valinta=0;
        while(valinta<1 | valinta>3){
        System.out.print("Anna valintasi ja paina ENTER:");
        valinta = lukija.nextInt();
        lukija.nextLine();
        }
        switch (valinta) {
            case 1:  lisaaTapahtumaPaivaan(paivamaara);             break;
            case 2:  vieTekstiTiedostoon(alku, loppu);            break;
            case 3:  paavalikko();          break;
        }
     
    }



     public static void lisaaTapahtumaPaivaan(Date pvm) throws ParseException, Exception{
        String tapahtumanNimi;
        String paikka;
        Date alkamisaika;
        Date paattymisaika;
        System.out.println("Anna tapahtuman nimi");
        tapahtumanNimi = lukija.nextLine();
        System.out.println("Anna tapahtuman paikka");
        paikka = lukija.nextLine();

        SimpleDateFormat paivamuoto = new SimpleDateFormat("dd.MM.yyyy");
        SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy.HH.mm");
        
        System.out.println("Anna tapahtuman alkamiskellonaika muodossa hh.mm");
        String alkamis = lukija.nextLine();
        
        System.out.println("Anna tapahtuman loppumiskellonaika muodossa hh.mm");
        String loppumis = lukija.nextLine();
        
        String str = paivamuoto.format(pvm);
        String alkukaten = str+"."+alkamis;
        String loppukaten = str+"."+loppumis;

//        System.out.println(alkukaten);
//        System.out.println(loppukaten);


        alkamisaika = df.parse(alkukaten);
        paattymisaika = df.parse(loppukaten);

//        System.out.println("alkamisaika: "+alkamisaika);
//        System.out.println("loppumisaika: "+paattymisaika);
        calendar1.addEvent(tapahtumanNimi, paikka, alkamisaika, paattymisaika);
        System.out.println("Tapahtuma on lisätty kalenteriin");

        paavalikkoon();
   
     }


    public static void paavalikkoon() throws Exception{
        int valinta=0;
        while(valinta!=1){
        System.out.print("\n(paina 1 ja enter palataksesi paavalikkoon)");
        valinta = lukija.nextInt();
        }
        switch (valinta) {
            case 1:  paavalikko();       break;
        }

    }

    public static void viikkoKerrallaan() throws Exception{

        System.out.println("\n\n\n\n");
        System.out.println("***VIIKKO KERRALLAAN***\n");
        System.out.println("");


        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.setFirstDayOfWeek(Calendar.MONDAY);


        int viikkonyt = c.get(Calendar.WEEK_OF_YEAR);
        System.out.println("Nyt on viikko "+viikkonyt);
        System.out.println("Minkä viikon haluat tulostaa? Anna viikon numero.");
        int haluttu = lukija.nextInt();
        lukija.nextLine();
        
        c.set(Calendar.WEEK_OF_YEAR,haluttu);

//        System.out.println("Calendarin mukaan haluttu-viikko: "+c.get(Calendar.WEEK_OF_YEAR));
       // int i = c.get(Calendar.DAY_OF_WEEK);
       // int i = c.getFirstDayOfWeek();
      // int i = c.get(Calendar.MONDAY);

        //muodostetaan maanantai ja sunnuntai
        c.set(Calendar.DAY_OF_WEEK,2);

        Date ma = c.getTime();
        c.add(Calendar.DATE, 6);
        Date su = c.getTime();

        /*muista tuhota:*/
//        System.out.println("Mahdollinen maanantai viikosta: "+c.getTime());
//
//        c.add(Calendar.DATE, 6);
//        System.out.println("Mahdollinen sunnuntai viikosta: "+c.getTime());

        SimpleDateFormat tarkka = new SimpleDateFormat("dd.MM.yyyy.HH.mm.ss");
        SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");

        String apuAlku = df.format(ma);
        String alkupvm = apuAlku+".00.00.00";
        Date alku = tarkka.parse(alkupvm);
       // System.out.println("tarkka alkupäivämäärä: "+alku);

        String apuLoppu = df.format(su);
        String loppupvm = apuLoppu+".23.59.59";
        Date loppu = tarkka.parse(loppupvm);
        //System.out.println("tarkka alkupäivämäärä: "+loppu);

        tulostaNaytolle(alku, loppu);

        System.out.println();
        System.out.println("_______________________________________________________________");
        System.out.println("1-TULOSTA TIEDOSTOON   2-PALAA PÄÄVALIKKOON");
        int valinta=0;
        while(valinta<1 | valinta>2){
        System.out.print("Anna valintasi ja paina ENTER:");
        valinta = lukija.nextInt();
        lukija.nextLine();
        }
        switch (valinta) {
            case 1:  vieTekstiTiedostoon(alku, loppu);            break;
            case 2:  paavalikko();          break;
        }

      }

    public static void kuukausiKerrallaan() throws Exception{
        System.out.println("\n\n\n\n");
        System.out.println("***KUUKAUSI KERRALLAAN***\n");
        System.out.println("");

        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.setFirstDayOfWeek(Calendar.MONDAY);

        int kuukausinyt = c.get(Calendar.MONTH);
        System.out.println("Nyt on kuukausi: "+(kuukausinyt+1));
        System.out.println("Minkä kuukauden haluat tulostaa? Anna kuukauden numero.");
        int haluttu = lukija.nextInt();
        lukija.nextLine();
        haluttu = haluttu -1;

        c.set(Calendar.MONTH,haluttu);
        c.set(Calendar.DAY_OF_MONTH,1);
     
        Date ekaPaiva = c.getTime();

        c.add(Calendar.MONTH, 1);
        c.add(Calendar.DATE, -1);

        Date vikaPaiva = c.getTime();

//        System.out.println("Alkupäivämäärä: "+ekaPaiva);
//        System.out.println("Loppupäivämäärä: "+vikaPaiva);

        SimpleDateFormat tarkka = new SimpleDateFormat("dd.MM.yyyy.HH.mm.ss");
        SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");

        String apuAlku = df.format(ekaPaiva);
        String alkupvm = apuAlku+".00.00.00";
        Date alku = tarkka.parse(alkupvm);
//        System.out.println("tarkka alkupäivämäärä: "+alku);

        String apuLoppu = df.format(vikaPaiva);
        String loppupvm = apuLoppu+".23.59.59";
        Date loppu = tarkka.parse(loppupvm);
//        System.out.println("tarkka alkupäivämäärä: "+loppu);

        tulostaNaytolle(alku, loppu);

        System.out.println();
        System.out.println("_______________________________________________________________");
        System.out.println("1-TULOSTA TIEDOSTOON   2-PALAA PÄÄVALIKKOON");
        int valinta=0;
        while(valinta<1 | valinta>2){
        System.out.print("Anna valintasi ja paina ENTER:");
        valinta = lukija.nextInt();
        lukija.nextLine();
        }
        switch (valinta) {
            case 1:  vieTekstiTiedostoon(alku, loppu);            break;
            case 2:  paavalikko();          break;
        }
        
    }

    public static void poistaTapahtuma(){
        
    }

    public static void tulostaNaytolle(Date alku, Date loppu){
        Event[] eventTaulukko = calendar1.findEventsByDate(alku, loppu);

        SimpleDateFormat startdf = new SimpleDateFormat("dd.MM.yyyy   HH:mm");
        SimpleDateFormat enddf = new SimpleDateFormat("HH:mm");
        for(Event e : eventTaulukko) {
                System.out.println(
                startdf.format(e.getStartDate())+"-"+
                enddf.format(e.getEndDate())+"   "+
                e.getName()+"   "+e.getLocation());
        }
    //syotteena talle metodille tulisi alkupaivamaara ja loppupaivamaara
    //ja sitten date(?) oliot tulostettaisiin silmukan avulla rivi kerrallaan
    }

    //kukaan ei vielä kutsu tätä!
    public static void vieTekstiTiedostoon(Date alku, Date loppu) throws FileNotFoundException, Exception{
    //syotteena talle metodille tulisi alkupaivamaara ja loppupaivamaara
    //kirjoitettaisiin txt-tiedostoon rivi kerrallaan
        File tdsto = new File("kalenterituloste.txt");
        PrintWriter kirjoitin = new PrintWriter(tdsto);

        Event[] eventTaulukko = calendar1.findEventsByDate(alku, loppu);

        SimpleDateFormat startdf = new SimpleDateFormat("dd.MM.yyyy   HH:mm");
        SimpleDateFormat enddf = new SimpleDateFormat("HH:mm");
        for(Event e : eventTaulukko) {
                kirjoitin.println(
                startdf.format(e.getStartDate())+"-"+
                enddf.format(e.getEndDate())+"   "+
                e.getName()+"   "+e.getLocation());
        }
        System.out.println("Tapahtumat talletettu tiedostoon kalenterituloste.txt");
        kirjoitin.close();
        paavalikkoon();
    }

       /*Calendarleikkimistä*/


        //aksessorit:
        
   
       // kutsujalle: Calendar apu = new Calendar();
}
